﻿//Damit das ganze funktioniert, muss die Tabelle einen thead und einen tbody element haben
var TableSearch = {
    config: {
        searchField: '#qsearch', //der Container in dem das Inputfeld für die Suche erstellt wird
        searchTable: '.search', //die class in den Tabellen die gefiltert werden sollen
        searchFieldId: 'searchbox',
        searchFieldName: 'Schnellsuche', //wenn angeben, dann wird noch ein Label erstellt mit dem Namen
        defaultQuery: ''
    },

    //Initialisieren des "Objektes"
    init: function (config) {
        $.extend(this.config, config); //nur die parameter überschreiben die auch übergeben wurden 
        this.timer;
        this.rows = $(this.config.searchTable + ' tbody tr');
        this.minSearchLength = 3;
        $(this.config.searchField).show();

        this.createSearchControl();
        this.bindEvents();
    },

    //Binden aller wichtigen Events
    bindEvents: function () {
        $('#' + this.config.searchFieldId).on('keyup', this.setFilter);
    },

    //Erstellen des Inputfeldes in dem der Suchstring angegeben werden kann
    createSearchControl: function () {
        //Das label mit dem namen vor das Eingabefeld setzten
        if (this.config.searchFieldName.length > 0) {
            $('<label>',
                    {
                        text: this.config.searchFieldName,
                        class: 'searchLabel'
                    }).appendTo(this.config.searchField);
        }

        //Input für die Suche erstellen
        $('<input>',
            {
                type: 'text',
                name: this.config.searchFieldId,
                id: this.config.searchFieldId
            }).appendTo(this.config.searchField);
    },

    //setzten des Filters für die Tabellendaten (Timeout)
    setFilter: function () {
        //das $(this) in diesem falle auf das Inputfeld verweißt,
        var self = TableSearch,
        //da es sich um eine funktion handelt die vom Eventhandler aufgerufen wird ist this das Inputcontrol
                input = this;

        if (input.value.length < self.minSearchLength) {
            //Alle Rows anzeigen, da der Filter erst ab 2 Eingaben ausgeführt wird, müssen hier immer alle Rows angezeigt werden
            self.rows.show();
        }

        clearTimeout(self.timer);
        //Nicht gleich Filtern, erst wenn mind. 3 Zeichen eingegeben wurden und wenn 400ms vorbei sind.
        self.timer = (input.value.length >= self.minSearchLength) && setTimeout(function () {
            //Setzten des Filters
            self.config.defaultQuery = input.value.toLowerCase();
            //Die Filtermethode heraussuchen
            self.filter();
        }, 200);
    },

    //Filtern der werte für die Tabelle
    filter: function () {
        var self = this;
        //Alle Rows anzeigen, da der Filter erst ab 2 Eingaben ausgeführt wird, müssen hier immer alle Rows angezeigt werden
        self.rows.show();

        $.each(self.rows, function (index, row) {
            //den Ganzen Text aus einer Zeile "extrahieren und dann in diesem Text nach dem passenden String suchen
            var currentText = $('*', row).text();
            if (!self.checkTextWithRegexp(currentText)) {
                //Jede Row die nicht den Regeln entspricht ausblenden
                $(row).hide();
            }
        });
    },

    //Den übergebenen Text überprüfen ob die Worte darin vorkommen
    checkTextWithRegexp: function (checkText) {
        var query = this.config.defaultQuery,
        regexp, count = 0;

        //alle worte nach denen gesucht werden soll heraussuchen
        var words = $.trim(query).split(' ');
        for (var i = 0; i < words.length; i++) {
            regexp = '/' + words[i] + '/ig';
            //Der Regex ausdruck muss erst noch "umgewandelt" werden mit eval, damit dieser auch als Regex Ausdruck erkannt werden kann.
            if (checkText.match(eval(regexp))) {
                //jedesmal wenn ein Wort gefunden wurde was gesucht wird hochzählen
                count++;
            }
        }

        //Der gesucht String für eine Zeile stimmt nur dann, wenn auch die Anzahl
        //von count der anzahl der Worte entspricht die gesucht wurden.
        if (count === words.length) {
            return true;
        }

        return false;
    }
};

